package com.kakaxi.mybilibili.net;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.vincestyling.netroid.DefaultRetryPolicy;
import com.vincestyling.netroid.IListener;
import com.vincestyling.netroid.NetworkResponse;
import com.vincestyling.netroid.ParseError;
import com.vincestyling.netroid.Response;
import com.vincestyling.netroid.request.JsonRequest;

import java.io.UnsupportedEncodingException;

/**
 * json带缓存标识请求类,由于出现了同一个json请求获取不同页数的json数据,因此加多了缓存标识区分同
 * 一个请求url不同的页数的json数据。
 * Created by kakaxi on 16/8/2.
 */
public class FastJsonCacheRequest extends JsonRequest<JSONObject> {

    /**
     * 同一个请求缓存的分页标识
     */
    private String mRequestCacheTag = "";

    /**
     * json请求构造方法, 这个方法为请求的缓存设置了标识
     *
     * @param method          请求方式
     * @param url             请求链接
     * @param jsonStr         json请求数据
     * @param listener        监听器
     * @param requestCacheTag 缓存标识
     */
    public FastJsonCacheRequest(int method, String url, String jsonStr,
                                IListener<JSONObject> listener, String requestCacheTag) {
        super(method, url, jsonStr == null ? null : jsonStr, listener);
        mRequestCacheTag = requestCacheTag;
        // 设置请求默认10秒超时, 重试请求1次
        setRetryPolicy(new DefaultRetryPolicy(10000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }


    /**
     * json请求构造方法
     *
     * @param method   请求方式
     * @param url      请求链接
     * @param jsonStr  json请求数据
     * @param listener 监听器
     */
    public FastJsonCacheRequest(int method, String url, String jsonStr,
                                IListener<JSONObject> listener) {
        this(method, url, jsonStr, listener, "");
    }

    /**
     * json请求构造方法, 这个方法为请求的缓存设置了标识
     *
     * @param url             请求链接
     * @param jsonStr         json请求数据
     * @param listener        监听器
     * @param requestCacheTag 缓存标识
     */
    public FastJsonCacheRequest(String url, String jsonStr, IListener<JSONObject> listener, String
            requestCacheTag) {
        this(jsonStr == null ? Method.GET : Method.POST, url, jsonStr, listener, requestCacheTag);
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String je = new String(response.data, response.charset);
            JSONObject jsonObject = JSON.parseObject(je);
            return Response.success(jsonObject, response);
        } catch (UnsupportedEncodingException var3) {
            return Response.error(new ParseError(var3));
        } catch (JSONException var4) {
            return Response.error(new ParseError(var4));
        }
    }

    @Override
    public String getCacheKey() {
        if (mRequestCacheTag != null) {
            return super.getCacheKey() + mRequestCacheTag;
        }
        return super.getCacheKey();
    }

}
